package com.game.state;

import java.util.Vector;

import android.graphics.Canvas;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;

import com.game.animation.AnimationObject;
import com.game.basic.BasicActivity;
import com.game.basic.BasicTouchableInterface;
import com.game.basic.BasicView;
import com.game.layer.BasicLayer;
import com.game.utils.PhoneInfo;

/**
 * 状态隶属于某个view
 *  */
public abstract class BasicState extends AnimationObject implements BasicTouchableInterface,OnGestureListener,OnDoubleTapListener{
	
//	protected MultiTouchGestureDetector gd;
	
	protected GestureDetector gd;
	
	
	public BasicView gameView;
	//标识初次启动
	public boolean initIng;
	//当前逻辑处理线程
	public Thread logicThread;
	
	public boolean pause=false;
	
	//状态的状态
	public byte state;
	
	//图层
	public Vector<BasicLayer> layers= new Vector<BasicLayer>();
	
	//标识正在触摸的图层
	public BasicLayer touchIngLayer = null;
	
	public int pressKey=0;
	
	/**
	 * 无参数自动使用BasicActivity的静态变量GameView
	 * 暂时游戏内只有一个view
	 */
	public BasicState(){
		//还未有view,自动初始化
		this(BasicActivity.instance.gameView==null?
				BasicActivity.instance.initView():BasicActivity.instance.gameView);
	}
	
	/**
	 * 真正的构造函数
	 * @param gameView
	 */
	public BasicState(BasicView gameView){
		Log.i("infos", "实例化"+this.getClass());
		
		this.gameView=gameView;
		
		initIng=true;//实例化的时候标识为首次执行
		
//		//初始化手势识别
//		gd=new MultiTouchGestureDetector(BasicActivity.instance,new BasicStateOnGestureListener(this));
		
		//初始化手势识别
		gd=new GestureDetector(this);
		gd.setOnDoubleTapListener(this);
		gd.setIsLongpressEnabled(false);//禁止长按
//		gd=new GestureDetector(new BasicStateOnGestureListener(this));
		
		//初始化大小
		basicRegion.setWidth(PhoneInfo.screenWidth_def);
		basicRegion.setHeight(PhoneInfo.screenHeight_def);
		drawRegion=false;//默认不绘制区域颜色
	}
	
	/**
	 * 启动一个逻辑处理线程*/
	public void startLogic(){
		if(logicThread==null||!logicThread.isAlive()){
			logicThread=new Thread(){
				@Override
				public void run() {
					Log.i("infos", "开始逻辑处理线程");
					logic();
				}
			};
			logicThread.start();
		}
	}
	
	
	/**
	 * 添加一个图层
	 * @param layer
	 */
	public void addLayer(BasicLayer layer){
		layers.add(layer);
	}
	
	/**
	 * 添加并显示图层
	 * @param layer
	 */
	public void addAndShowLayer(BasicLayer layer){
		addLayer(layer);
		layer.show();
	}
	
	/**
	 * 删除一个图层
	 * @param layer
	 */
	public void removeLayer(BasicLayer layer){
		layers.remove(layer);
	}
	
	/*初始化方法*/
	public abstract void init();
	
	@Override
	public void paint(Canvas canvas){
		logicInPaint();
		paintState(canvas);
		//绘制各个图层
		for(int i=0,n=layers.size();i<n;i++){
			BasicLayer current = layers.get(i);
			boolean drawAble = current.isShow();//不显示 也不能draw
			if(drawAble){
				for(int j=i+1;j<n;j++){
					BasicLayer next = layers.get(j);
					drawAble=!next.getCoverDraw();
				}
			}
			if(drawAble){
				current.draw(canvas);
			}
		}
	}
	
	/**
	 * 给不需要图层的状态调用的
	 */
	public abstract void paintState(Canvas canvas);
	
	/*逻辑处理方法,在paint中调用*/
	public abstract void logicInPaint();
	
	
	/*逻辑处理方法,在逻辑线程中调用*/
	public abstract void logic();
	
	/*销毁方法*/
	public abstract void destory();
	
	
	
	/*点击方法*/
	public  boolean onTouchEvent(MotionEvent event){
		//动画绘制中 不能点击
		if(gradualchangIng){
			return false;
		}
		
//		return gd.onTouchEvent(event);
		
		
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		
		
		if(touchIngLayer!=null){
			touchIngLayer.onTouchEvent(event);
			return true;
		}else{
			for(int i=layers.size()-1;i>=0;i--){
				BasicLayer current = layers.get(i);
				boolean touchAble = current.isShow();//不显示 也不能touch
				if(touchAble){
					if(current.onTouchEvent(event)){
						//已响应触摸事件,下面的不再响应
						isLayerResponse=true;
						break;
					}
					if(current.isCoverTouch()){
						//完全遮挡 下面的不再响应
						break;
					}
				}
				//判断下一个图层的点击
			}
		}
		
		
		
		//响应state的事件
		if(!isLayerResponse){
			int action = event.getAction();
			float x=event.getX();
			float y=event.getY();
			switch(action){
			
			case MotionEvent.ACTION_DOWN:{
				//判断点击
				pointerPress(x,y);
				break;
			}
			case MotionEvent.ACTION_MOVE:{
				//判断移动
				pointerMove(x,y);
				break;
			}
			case MotionEvent.ACTION_UP:{
				//判断提起
				pointerRelaese(x,y);
				break;
			}
			}
		}
		return isLayerResponse;
	}
	
	// 单击，触摸屏按下时立刻触发 
	public boolean onDown(MotionEvent e) {
		Log.i("GestureListener", "onDown");
		if(touchIngLayer!=null){
			return touchIngLayer.onDown(e);
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onDown(e)){
					//已响应触摸事件,下面的不再响应
					//
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		if(!isLayerResponse){
			pointerPress(e.getX(),e.getY());
		}
		return isLayerResponse;
	}

	// 抬起，手指离开触摸屏时触发(长按、滚动、滑动时，不会触发这个手势) 
	public boolean onSingleTapUp(MotionEvent e) {
		Log.i("GestureListener", "onSingleTapUp");
		if(touchIngLayer!=null){
			return touchIngLayer.onSingleTapUp(e);
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onSingleTapUp(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		if(!isLayerResponse){
			pointerRelaese(e.getX(),e.getY());
		}
		return isLayerResponse;
	}
	
	// 短按，触摸屏按下后片刻后抬起，会触发这个手势，如果迅速抬起则不会 
	public void onShowPress(MotionEvent e) {
		Log.i("GestureListener", "onShowPress");
		if(touchIngLayer!=null){
			touchIngLayer.onShowPress(e);
			return;
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onShowPress(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
	}
	
	// 长按，触摸屏按下后既不抬起也不移动，过一段时间后触发 
	public void onLongPress(MotionEvent e) {
		Log.i("GestureListener", "onLongPress");
		if(touchIngLayer!=null){
			touchIngLayer.onLongPress(e);
			return;
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onLongPress(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
	}
	
	// 滑动，触摸屏按下后快速移动并抬起，会先触发滚动手势，跟着触发一个滑动手势 
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		Log.i("GestureListener", "onFling");
		if(touchIngLayer!=null){
			return touchIngLayer.onFling(e1, e2, velocityX, velocityY);
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onFling(e1, e2, velocityX, velocityY)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		return isLayerResponse;
	}
	
	// 滚动，触摸屏按下后移动 
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {
		Log.i("GestureListener", "onScroll");
		if(touchIngLayer!=null){
			return touchIngLayer.onScroll(e1, e2, distanceX, distanceY);
		}
		//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onScroll(e1, e2, distanceX, distanceY)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		return isLayerResponse;
	}
	
	// 双击，手指在触摸屏上迅速点击第二下时触发
    public boolean onDoubleTap(MotionEvent e) { 
    	Log.i("GestureListener", "onDoubleTap");
    	if(touchIngLayer!=null){
			return touchIngLayer.onDoubleTap(e);
		}
    	//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onDoubleTap(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		return isLayerResponse;
    } 

    // 双击的按下跟抬起各触发一次 
    public boolean onDoubleTapEvent(MotionEvent e) { 
    	Log.i("GestureListener", "onDoubleTapEvent");
    	if(touchIngLayer!=null){
			return touchIngLayer.onDoubleTapEvent(e);
		}
    	//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onDoubleTapEvent(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		return isLayerResponse;
    } 

    // 单击确认，即很快的按下并抬起，但并不连续点击第二下
    public boolean onSingleTapConfirmed(MotionEvent e) { 
    	Log.i("GestureListener", "onSingleTapConfirmed");
    	if(touchIngLayer!=null){
			return touchIngLayer.onSingleTapConfirmed(e);
		}
    	//标识state上的图层是否响应了事件
		boolean isLayerResponse=false;
		for(int i=layers.size()-1;i>=0;i--){
			BasicLayer current = layers.get(i);
			boolean touchAble = current.isShow();//不显示 也不能touch
			if(touchAble){
				if(current.onSingleTapConfirmed(e)){
					//已响应触摸事件,下面的不再响应
					isLayerResponse=true;
					break;
				}
				if(current.isCoverTouch()){
					//完全遮挡 下面的不再响应
					break;
				}
			}
			//判断下一个图层的点击
		}
		return isLayerResponse;
    } 
	
	
	/**
	 * 判断是否按下状态
	 * @return
	 */
	public boolean isPressing(){
		return gameView.pressing;
	}
	
	public abstract void pointerPress(float x,float y);
	
	public abstract void pointerRelaese(float x,float y);
	
	public abstract void pointerMove(float x,float y);
		
	/**
	 * 休眠方法*/
	public void DelayTime( long time ){
		try{
			Thread.sleep( time );
		}catch( Exception ex ){
			ex.printStackTrace();
		}
	}
}